﻿using System;
using System.Collections.Generic;
using System.Linq.Expressions;

namespace Fabrica
{
    public interface IRepositorio<T> where T : class
    {
        /// <summary>
        /// Retorna um objeto da entidade manipulada conforme o valor do ID.
        /// </summary>
        /// <param name="expressao">Uma expressão lambda.</param>
        /// <returns>A entidade encontrada. Caso contrário retorna null.</returns>
        T ObtemPorID( Expression<Func<T, bool>> expressao );

        /// <summary>
        /// Retorna todos os objetos da entidade manipulada.
        /// </summary>
        /// <returns>Uma lista de objetos.</returns>
        IList<T> ObtemTodos();

        /// <summary>
        /// Adiciona a entidade indicada.
        /// </summary>
        /// <param name="entidade">A entidade a ser adicionada.</param>
        /// <returns>Retorna a entidade após a inclusão. Apresenta erro caso retorne null.</returns>
        T Adicionar( T entidade );

        /// <summary>
        /// Exclui a entidade indicada.
        /// </summary>
        /// <param name="entidade">A entidade a ser excluída.</param>
        /// <returns>Retorne true se a entidade for excluída. Caso contrário retorna false.</returns>
        bool Excluir( T entidade );

        /// <summary>
        /// Atualiza a entidade indicada.
        /// </summary>
        /// <param name="Entidade">A entidade a ser atualizada.</param>
        /// <returns>Retorne true se a entidade for atualizada. Caso contrário retorne false.</returns>
        bool Atualizar( T Entidade );
    }
}
